/**
 * @file EcomAdminRemote.java
 * Projet eCOM 2010 (Miage Descartes)
 * @author Doido Sébastien
 * @version 2
 * @brief Interface du bean dédié aux opérations réalisables par l'administrateur
 */
package ecom.beans;

import java.util.Collection;
import javax.ejb.Remote;

/**
 * @brief Opérations réalisables pour le bean interface d'administration
 * @author Doido Sébastien
 */
@Remote
public interface EcomAdminRemote {

    // create actions
    /**
     * @brief Creation d'un compte acheteur/magasin
     * @param accountOwner : nom du propriétaire
     * @param balance : solde du compte
     * @param login : login pour l'accès aux opérations de gestion du compte
     * @param pass : mot de passe
     * @param surname : prénom du propriétaire
     * @param address : adresse du propriétaire
     * @param birthdate : date de naissance du propriétaire
     * @return l'identifiant affecté au compte
     */
    public int createAccount(String accountOwner, double balance, String login, String pass, String surname, String address, String birthdate);

    /**
     * @brief Creation d'une catégorie de produit
     * @param categoryName : nom de la catégorie
     * @return l'identifiant affecté à la catégorie
     */
    public int createProductCategory(String categoryName);

    /**
     * @brief Creation d'un nouveau produit
     * @param productName : nom du produit
     * @param description : description du produit
     * @param categoryId : catégorie du produit
     * @return  l'identifiant affecté au produit
     * @throws ecom.beans.UnknownIdentifier : exception levée si catégorie inexistante
     */
    public int createProduct(String productName, String description, int categoryId) throws UnknownIdentifier;

    /**
     * @brief Creation d'un nouveau magasin de produits
     * @param productStoreAccountId : compte affecté au magasin
     * @param productStoreName : nom du magasin
     * @param city : ville du magasin
     * @return l'identifiant affecté au magasin
     * @throws ecom.beans.UnknownIdentifier
     */
    public int createProductStore(int productStoreAccountId, String productStoreName, String city) throws UnknownIdentifier;

    /**
     * @brief Creation d'une ligne d'inventaire (stock)
     * @param productStoreId : référence du magasin
     * @param productId : référence du produit
     * @param quantity : quantité disponible
     * @param price : prix de vente
     * @return l'identifiant affecté à la ligne de stock
     * @throws ecom.beans.UnknownIdentifier : exception levée si produit|magasin inexistant
     */
    public int createStockLine(int productStoreAccountId, int productId, int quantity, double productPrice) throws UnknownIdentifier;

    // update actions
    /**
     * @brief Mise à jour d'un compte acheteur/magasin
     * @param accountId : id du compte à modifier
     * @param accountOwner : nom du propriétaire
     * @param balance : solde du compte
     * @param login : login pour l'accès aux opérations de gestion du compte
     * @param pass : mot de passe
     * @param surname : prénom du propriétaire
     * @param address : adresse du propriétaire
     * @param birthdate : date de naissance du propriétaire
     * @throws ecom.beans.UnknownIdentifier : exception levée lorsque compte inexistant
     */
    public void updateAccount(int accountId, String accountOwner, double balance, String login, String pass, String surname, String address, String birthdate) throws UnknownIdentifier;

    /**
     * @brief Mise à jour d'une catégorie
     * @param categoryId : id de la catégorie à modifier
     * @param categoryName : nouveau nom
     * @throws ecom.beans.UnknownIdentifier : exception levée lorsque catégorie inexistante
     */
    public void updateProductCategory(int categoryId, String categoryName) throws UnknownIdentifier;

    /**
     * @brief Mise à jour d'un produit
     * @param productId : produit à modifier
     * @param productName : nom du produit
     * @param description : description du produit
     * @param categoryId : catégorie du produit
     * @return  l'identifiant affecté au produit
     * @throws ecom.beans.UnknownIdentifier : exception levée si produit ou catégorie inexistante
     */
    public void updateProduct(int productId, String productName, String description, int categoryId) throws UnknownIdentifier;

    /**
     * @brief Mise à jour d'un magasin de produits
     * @param storeId : magasin à modifier
     * @param productStoreAccountId : compte affecté au magasin
     * @param productStoreName : nom du magasin
     * @param city : ville du magasin
     * @return l'identifiant affecté au magasin
     * @throws ecom.beans.UnknownIdentifier : exception levée si magasin ou compte inexistant
     */
    public void updateProductStore(int storeId, int productStoreAccountId, String productStoreName, String city) throws UnknownIdentifier;

    // remove actions
    /**
     * @brief Suppression d'un compte
     * @param idAccount : référence du compte
     * @throws ecom.beans.UnknownIdentifier : exception levée si compte inexistant
     */
    public void removeAccount(int idAccount) throws UnknownIdentifier;

    /**
     * @brief Suppression d'une catégorie de produits
     * @param idCateg : id de la catégorie
     * @throws ecom.beans.UnknownIdentifier : exception levée si catégorie inexistante
     */
    public void removeCategory(int idCateg) throws UnknownIdentifier;

    /**
     * @brief Suppression d'un produit
     * @param idProduct : référence du produit
     * @throws ecom.beans.UnknownIdentifier : exception levée si produit inexistant
     */
    public void removeProduct(int idProduct) throws UnknownIdentifier;

    /**
     * @brief Suppression d'un magasin
     * @param idProductStore : référence du magasin
     * @throws ecom.beans.UnknownIdentifier : exception levée si magasin inexistant
     */
    public void removeStore(int idStore) throws UnknownIdentifier;

    /**
     * @brief Suppression de produits (quantité) d'une ligne de stock
     * @param productStoreId : magasin vendant le produit
     * @param productId : produit vendu
     * @param quantity : quantité à supprimer
     * @throws ecom.beans.UnknownIdentifier : magasin ou produit inconnu
     * @throws java.lang.Exception : erreur de suppression (quantité >max)
     */
    public void removeStockLine(int productStoreId, int productId, int quantity) throws UnknownIdentifier, Exception;

    /**
     * @brief liste tous les comptes acheteurs/magasinc connus
     * @return les comptes acheteurs/magasinc connus
     */
    public Collection<AccountBean> getAllAccounts();

    // Common Functions
    /**
     * @brief Renvoie un compte pour un ID donné
     * @param id : numéro du compte demandé
     * @return le compte associé à l'id demandé
     * @throws ecom.beans.UnknownIdentifier : id inexistant
     */
    public AccountBean getAccountById(int idAccount) throws UnknownIdentifier;

    /**
     * @brief Renvoie un compte pour un couple login/pass donné
     * @param login : identifiant à vérifier
     * @param pass : pass associé à l'identifiant
     * @return le compte associé au couple login/pass
     */
    public AccountBean getAccountByCredential(String login, String pass);

    /**
     * @brief Renvoie tous les produits connus
     * @return tous les produits connus
     */
    public Collection<ProductBean> getProducts();

    /**
     * @brief Renvoie un produit pour un id donné
     * @param idProduct : id demandé
     * @return un produit pour un id donné
     * @throws ecom.beans.UnknownIdentifier : référence produit inexistante
     */
    public ProductBean getProductById(int idProduct) throws UnknownIdentifier;

    /**
     * @brief renvoie tous les magasins connus
     * @return tous les magasins connus
     */
    public Collection<ProductStoreBean> getStores();

    /**
     * @brief Renvoie un magasin  pour un id donné
     * @param id : id demandé
     * @return un magasin  pour un id donné
     * @throws ecom.beans.UnknownIdentifier : : référence magasin inexistante
     */
    public ProductStoreBean getStoreById(int id) throws UnknownIdentifier;

    /**
     * @brief Renvoie toutes les catégories connues
     * @return toutes les catégories connues
     */
    public Collection<CategoryBean> getCategories();

    /**
     * @brief Renvoie une catégorie  pour un id donné
     * @param id : id demandé
     * @return une catégorie  pour un id donné
     * @throws ecom.beans.UnknownIdentifier : référence catégorie inexistante
     */
    public CategoryBean getCategoryById(int id) throws UnknownIdentifier;

    /**
     * @brief Renvoie toutes les lignes d'inventaire connues
     * @return toutes les lignes d'inventaire connues
     */
    public Collection<WarehouseLineBean> getStocks();

    /**
     * @brief Renvoie toutes les lignes d'inventaire relatives à un magasin
     * @param productStoreId : référence magasin
     * @return toutes les lignes d'inventaire relatives à un magasin
     * @throws ecom.beans.UnknownIdentifier : id magasin inexistant
     */
    public Collection<WarehouseLineBean> getProductsInStore(int productStoreId) throws UnknownIdentifier;

    /**
     * @brief Renvoie toutes les lignes d'inventaire relatives à un produit
     * @param productId : référence produit
     * @return toutes les lignes d'inventaire relatives à un produit
     * @throws ecom.beans.UnknownIdentifier : id produi inexistant
     */
    public Collection<WarehouseLineBean> getProductsByProductId(int productId) throws UnknownIdentifier;

    /**
     * @brief Renvoie toutes les lignes d'inventaire relatives à un produit dont le nom est 'name'
     * @param name : nom du produit recherché
     * @return toutes les lignes d'inventaire relatives à un produit dont le nom est 'name'
     */
    public Collection<WarehouseLineBean> getProductsByName(String name);

    /**
     * @brief Renvoie toutes les lignes d'inventaire relatives à un produit dont le nom similaire à 'name'
     * @param name : critère de similitude
     * @return toutes les lignes d'inventaire relatives à un produit dont le nom similaire à 'name'
     */
    public Collection<WarehouseLineBean> getProductsBySimilarName(String name);

    /**
     * @brief Renvoie toutes les lignes d'inventaire pour un prix de vente compris entre 'min' et 'max'
     * @param min : prix min (eur)
     * @param max : prix max (eur)
     * @return  toutes les lignes d'inventaire pour un prix de vente compris entre 'min' et 'max'
     */
    public Collection<WarehouseLineBean> getProductsByPriceInterval(double min, double max);

    /**
     * @brief Renvoie toutes les lignes d'inventaire pour un prix de vente < 'max'
     * @param max : prix max (eur)
     * @return  toutes les lignes d'inventaire pour un prix de vente < 'max'
     */
    public Collection<WarehouseLineBean> getProductsByByMaximumPrice(double max);

    /**
     * @brief Renvoie toutes les lignes d'inventaire pour un produit de catégorie 'idCateg'
     * @param idCateg : référence catégorie
     * @return toutes les lignes d'inventaire pour un produit de catégorie 'idCateg'
     * @throws ecom.beans.UnknownIdentifier : catégorie inexistante
     */
    public Collection<WarehouseLineBean> getProductsByCategory(int idCateg) throws UnknownIdentifier;
}